package controle.aplicativo.util;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

public class UtilResource {
	private Properties properties;

	private List<String> mensagens;

	/**
	 * Construtor recebe a classe onde serao utilizados os recursos do
	 * ResourceUtil e um array com os nomes dos arquivos properties.
	 * 
	 * Exemplo:
	 * 
	 * UtilResource resource = new UtilResource(Pessoa.class, new String[] {
	 * "/br/gov/mapa/corporativo/negocio/properties/mensagem_pt_BR.properties"
	 * });
	 * 
	 * @param classe
	 *            - classe de origem da chamada dos recursos
	 * @param propertiesFile
	 *            - contem os arquivos propeties que serao carregados
	 * @throws Exception
	 */
	public UtilResource(Class<?> classe, String[] propertiesFile)
			throws Exception {
		if (propertiesFile != null && propertiesFile.length > 0) {
			this.properties = new Properties();
			for (String _properties : propertiesFile) {
				this.properties.load(classe.getResourceAsStream(_properties));
			}
		} else {
			throw new Exception("É obrigatório o parâmetro propertiesFiles");
		}
	}

	public UtilResource() {
	}

	/**
	 * Metodo indica se existem mensagens adicionadas a serem apresentadas para
	 * o usuario.
	 * 
	 * @return true|false
	 */
	public boolean isMensagens() throws Exception {
		return this.mensagens != null && this.mensagens.size() > 0 ? true
				: false;
	}

	/**
	 * Metodo adiciona as mensagens a serem apresentadas ao usuario.
	 * 
	 * Parametros:
	 * 
	 * 1. O campo key representa a chave dentro de um determinado arquivo
	 * properties. OBRIGATORIO 2. O campo parametros representa os possIveis
	 * valores a serem substituIdos dentro da mensagem original. OPCIONAL
	 * 
	 * Exemplo;
	 * 
	 * Key: msg.campos.obrigat�rios=O campo {0} e de preenchimento obrigatorio
	 * Parametros: Usuario
	 * 
	 * Output: O campo Usuario e de preenchimento obrigatorio.
	 * 
	 * @param key
	 *            - chave do arquivo properties
	 * @param parametros
	 *            - objeto contendo valores de substituicao
	 */
	public void addMensagens(String key, Object[] parametros) throws Exception {
		if (mensagens == null) {
			this.mensagens = new ArrayList<String>();
		}

		String pattern = this.properties.getProperty(key);
		if (pattern != null) {
			if (parametros != null && parametros.length > 0) {
				MessageFormat msgFormat = new MessageFormat(pattern);
				mensagens.add(msgFormat.format(parametros));
			} else {
				mensagens.add(pattern);
			}
		}
	}

	/**
	 * Metodo adiciona as mensagens a serem apresentadas ao usuario.
	 * 
	 * Parametros:
	 * 
	 * 1. O campo key representa a chave dentro de um determinado arquivo
	 * properties. OBRIGATORIO 2. O campo arguments representa os possiveis
	 * valores a serem substituidos dentro da mensagem original. OPCIONAL
	 * 
	 * Exemplo;
	 * 
	 * Key: msg.campos.obrigatorios=O campo {0} é de preenchimento obrigatorio
	 * Parametros: Usuario
	 * 
	 * Output: O campo Usuario é de preenchimento obrigatorio.
	 * 
	 * @param key
	 *            - chave do arquivo properties
	 * @param arguments
	 *            - Strings de substituicao dos coringas da mensagem original
	 */
	public void addMensagens(String key, String... arguments) throws Exception {
		if (mensagens == null) {
			this.mensagens = new ArrayList<String>();
		}

		String pattern = this.properties.getProperty(key);
		if (pattern != null) {
			if (arguments != null && arguments.length > 0) {
				MessageFormat msgFormat = new MessageFormat(pattern);
				mensagens.add(msgFormat.format(arguments));
			} else {
				mensagens.add(pattern);
			}
		}
	}

	/**
	 * Metodo retorna as mensagens formatadas de modo padrao para serem
	 * apresentadas ao usuario, as mensagens sao separadas pelo caractere '~'.
	 * 
	 * Exemplo:
	 * 
	 * Mensagem: Campo invalido!~Campo de preenchimento obrigatorio!~
	 * 
	 * @return mensagem formatada
	 */
	public String getMensagens() throws Exception {
		StringBuilder mensagem = new StringBuilder("");
		if (this.mensagens != null && this.mensagens.size() > 0) {
			for (String _mensagem : this.mensagens) {
				mensagem.append(_mensagem).append("~");
			}
		}
		return !"".equals(mensagem.toString()) ? mensagem.toString() : null;
	}

	/**
	 * Metodo retorna as mensagens formatadas para a camada WEB afim de serem
	 * apresentadas aos usuarios, as mensagens sao separadas pela tag '<br/>
	 * '. A lista contendo as mensagens sao padronizadas pelo praprio
	 * desenvolvedor.
	 * 
	 * Parametros:
	 * 
	 * 1. Mensagens: colecao composta de valores textuais, como por exemplo:
	 * 'Campo invalido'
	 * 
	 * @param mensagens
	 *            - colecao composta por valores textuais.
	 * @return mensagem formatada
	 */
	public String getMensagensWeb(List<String> mensagens) throws Exception {
		StringBuilder mensagem = new StringBuilder("");
		if (mensagens != null && mensagens.size() > 0) {
			for (String _mensagem : mensagens) {
				mensagem.append(_mensagem).append(" <br/> ");
			}
		}
		return !"".equals(mensagem.toString()) ? mensagem.toString() : null;
	}

	/**
	 * Metodo retorna as mensagens formatadas para a camada WEB afim de serem
	 * apresentadas aos usuarios, as mensagens sao separadas pela tag '<br/>
	 * '. A lista contendo as mensagens sao padronizadas pelo componente,
	 * atraves do caractere '~'.
	 * 
	 * Parametro: 1. Mensagens: Objeto contendo valores textuais, separados pelo
	 * caractere '~'.
	 * 
	 * Exemplo:
	 * 
	 * Mensagem: Campo invalido!~Campo de preenchimento obrigatorio!~ *
	 * 
	 * @param mensagens
	 *            - contem valores textuais separados pelo caractere '~'
	 * @return mensagem formatada
	 */
	public String getMensagensWeb(String mensagens) throws Exception {
		StringBuilder mensagem = new StringBuilder("");
		if (mensagens != null && !"".equals(mensagens)) {
			String[] arraymsg = mensagens.split("~");
			for (String _mensagem : arraymsg) {
				mensagem.append(_mensagem).append(" <br/> ");
			}
		}
		return !"".equals(mensagem.toString()) ? mensagem.toString() : null;
	}

	public String getMensagens(String key, Object[] parametros)
			throws Exception {
		String pattern = key;
		if (this.properties != null) {
			pattern = this.properties.getProperty(key);
			if (pattern != null) {
				if (parametros != null && parametros.length > 0) {
					MessageFormat msgFormat = new MessageFormat(pattern);
					pattern = msgFormat.format(parametros);
				}
			}
		}

		return pattern;
	}

	/**
	 * Metodo retorna uma mensagens formatada de acordo com parametros passados
	 * 
	 * Parametros:
	 * 
	 * 1. O campo key representa a chave dentro de um determinado arquivo
	 * properties. OBRIGATORIO
	 * 
	 * 2. O campo arguments representa os poss�veis valores a serem substitu�dos
	 * dentro da mensagem original. OPCIONAL
	 * 
	 * Exemplo;
	 * 
	 * Key: msg.campos.obrigatarios=O campo {0} é de preenchimento obrigatorio
	 * Parametros: Usuario
	 * 
	 * Output: O campo Usuario é de preenchimento obrigatorio.
	 * 
	 * @param key
	 *            - chave do arquivo properties
	 * @param arguments
	 *            - Strings de substituicao dos coringas da mensagem original
	 */
	public String getMensagens(String key, String... arguments)
			throws Exception {
		String pattern = key;
		if (this.properties != null) {
			pattern = this.properties.getProperty(key);
			if (pattern != null) {
				if (arguments != null && arguments.length > 0) {
					MessageFormat msgFormat = new MessageFormat(pattern);
					pattern = msgFormat.format(arguments);
				}
			}
		}
		return pattern;
	}

	public void clearMensagens() throws Exception {
		if (this.mensagens != null) {
			this.mensagens.clear();
		}
	}
}
